﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using System.Web.Services;
using SuperStar.Models;

namespace SuperStar.Areas.Admincp.Controllers
{
    [Authorize(Roles = "Administrator")]
    public class ProductController : Controller
    {
        private readonly ProductModels _productModel = new ProductModels();
        private readonly ProductTypeModels _productTypeModels = new ProductTypeModels();

        public ActionResult Index()
        {
            // Debugger role
            if (User.IsInRole("Debugger"))
            {
                var debugger = new Dictionary<String, String>
                               {
                                   {"0", "Bình thường"},
                                   {"7_error", "TH 7 Error - Demo lỗi Dealock với cập nhật tặng phẩm"},
                                   {"7_fix", "TH 7 Fix - Demo fix lỗi Dealock với cập nhật tặng phẩm"},
                                   {"8_error", "TH 8 Error - Demo lỗi Dealock với cập nhật sản phẩm"},
                                   {"8_fix", "TH 8 Fix - Demo fix lỗi Dealock với cập nhật sản phẩm"}
                               };
                Debugger();
                ViewData["debugger"] = debugger;
            }
            return View();
        }
        [HttpPost, ValidateInput(false)]
        public void Debugger()
        {
            if (Session["product_debugger"] == null)
            {
                Session.Add("product_debugger", "0");
            }
            if (Request.Params["product_debugger"] != null)
            {
                Session["product_debugger"] = Request.Params["product_debugger"];
            }
            _productModel.DEBUGTYPE
                   = _productTypeModels.DEBUGTYPE
                   = Session["product_debugger"].ToString();
        }


        /// <summary>
        /// Lấy danh sách sản phẩm
        /// </summary>
        /// <param name="jtStartIndex">Bắt đầu</param>
        /// <param name="jtPageSize">Số lượng</param>
        /// <param name="jtSorting">Sắp xếp theo</param>
        /// <returns></returns>
        public ActionResult GetLists(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {
                // Đếm tổng số lượng sản phẩm
                var count = _productModel.GetCountAllProducts();
                // Lấy danh sách sản phẩm và tạo mới đối tượng chuẩn bị Encode JSon 
                // Nếu không select new thì sẽ lỗi "A circular reference was detected..." 
                // do tham chiếu với nhiều đối tượng khác như A có B mà B có A => A call B && B call A
                var products = _productModel.GetAllProducts(jtStartIndex, jtPageSize, jtSorting)
                               .Select(p => new {
                               Id = p.Id,
                               p.ProductType_Id,
                               p.GiftPoint,
                               p.Contents,
                               p.DateAdded,
                               p.EndReceiveDate,
                               p.EndSaleDate,
                               p.StartSaleDate,
                               p.StartReceiveDate,
                               p.Image,
                               p.Intro,
                               p.Name,
                               p.Price,
                               p.Quantity,
                               p.RemainAmount
                       });
                // Trả về đúng format gồm Result, Records, TotalRecordCount cho jTable hiển thị
                var result = new {
                                     Result = "OK",
                                     Records = products,
                                     TotalRecordCount = count
                                 };

                return Json(result, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        /// <summary>
        ///  Lấy danh sách loại sản phẩm để chọn options "loại sp" trên table
        /// </summary>
        /// <returns></returns>
        public JsonResult GetProductTypes()
        {
            try
            {
               // Lấy danh sách loại sản phẩm và tạo mới đối tượng chuẩn bị Encode JSon 
                var productTypes = _productTypeModels.GetList()
                                                     .Select(p => new
                                                                {
                                                                    Value = p.Id, // Giá trị trả về
                                                                    DisplayText = p.Name // Giá trị hiển thị
                                                                });
                // Trả về đúng format gồm Result, Options cho jTable hiển thị                                    
                var result = new
                            {
                                Result = "OK",
                                Options = productTypes
                            };
                return Json(result, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        public ActionResult Upload(HttpPostedFileBase qqfile)
        {
            var pathFile = "~/Content/images/products/";
            if (qqfile != null)
            {
                // this works for IE
                var filename = Path.Combine(Server.MapPath(pathFile), Path.GetFileName(qqfile.FileName));
                qqfile.SaveAs(filename);
                return Json(new { success = true }, "text/html");
            }
            else
            {
                // this works for Firefox, Chrome
                var filename = Request["qqfile"];
                if (!string.IsNullOrEmpty(filename))
                {
                    filename = Path.Combine(Server.MapPath(pathFile), Path.GetFileName(filename));
                    using (var output = System.IO.File.Create(filename))
                    {
                        Request.InputStream.CopyTo(output);
                    }
                    return Json(new { success = true });
                }
            }
            return Json(new { success = false });
        
        }
        [HttpPost, ValidateInput(false)]
        public ActionResult Update(Product product)
        {
            Debugger();
            object result;
            try
            {
                if(_productModel.UpdateProduct(product))
                    result = new { Result = "OK" };
                else
                    result = new { Result = "ERROR", Message = "Có lỗi trong quá trình cập nhật!" };
               
            }
            catch (Exception ex)
            {
                result = new { Result = "ERROR", Message = ex.Message+ex.InnerException.Message };
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Create(Product product)
        {
            object result;
            try
            {
                if (!ModelState.IsValid)
                {
                    var errors = string.Join("<br/>", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));
                    return Json(new { Result = "ERROR", Message = "Lỗi trong quá trình thêm:<br/>" + errors });
                }
                   
                
                var productInserted = _productModel.InsertProduct(product);
                
                if(productInserted != null)
                {
                    var record = new
                    {
                        Id = productInserted.Id,
                        productInserted.ProductType_Id,
                        productInserted.GiftPoint,
                        productInserted.Contents,
                        productInserted.DateAdded,
                        productInserted.EndReceiveDate,
                        productInserted.EndSaleDate,
                        productInserted.StartSaleDate,
                        productInserted.StartReceiveDate,
                        productInserted.Image,
                        productInserted.Intro,
                        productInserted.Name,
                        productInserted.Price,
                        productInserted.Quantity,
                        productInserted.RemainAmount
                    };
                    result = new { Result = "OK", Record = record};
                }
                else
                    result = new { Result = "ERROR", Message = "Có lỗi trong quá trình cập nhật!" };

            }
            catch (Exception ex)
            {
                result = new { Result = "ERROR", Message = ex.Message + ex.InnerException };
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        [HttpPost]
        public JsonResult Delete(int id)
        {
            try
            {
                _productModel.DeleteProduct(id);
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
    }
}
